﻿using System;
using System.Collections.Generic;
using System.Data;

namespace Gestión_UTN.blimpl
{
    class fechaExamenblimpl : bl.fechaExamenbl
    {
        private static Gestión_UTN.da.fechaExamenda createFechaExamen = Gestión_UTN.factories.dafactory.createFechaExamen();
        private static Gestión_UTN.bl.materiabl createMateria = Gestión_UTN.factories.blfactory.createMateria();
        private static Gestión_UTN.bl.tipoExamenbl createTipoExamen = Gestión_UTN.factories.blfactory.createTipoExamen();

        public bool SaveFechaExamen(bo.FechaExamenbo fec)
        {
            bool ingresada = false;

            try
            {
                ingresada = (null != fec)
                   ? createFechaExamen.SaveFechaExamen(fec.TipoExamen.Id, fec.Materia.Id, fec.Fe_fecha)
                   : false;
            }
            catch (exceptions.daexception ex)
            {
                ingresada = false;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                ingresada = false;
                throw new exceptions.blexception(ex.Message);
            }

            return ingresada;
        }

        public bool DeleteFechaExamen(DateTime fe_fecha, int mat_id)
        {
            bool eliminada = false;

            try
            {
                eliminada = (null != fe_fecha && 0 != mat_id)
                   ? createFechaExamen.DeleteFechaExamen(fe_fecha, mat_id)
                   : false;
            }
            catch (exceptions.daexception ex)
            {
                eliminada = false;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                eliminada = false;
                throw new exceptions.blexception(ex.Message);
            }

            return eliminada;
        }

        public bool ModifyFechaExamen(DateTime fe_fecha_anterior, int mat_id_anterior, bo.FechaExamenbo fec)
        {
            bool modificada = false;

            try
            {
                modificada = (null != fe_fecha_anterior && 0 != mat_id_anterior && null != fe_fecha_anterior)
                   ? createFechaExamen.ModifyFechaExamen(fe_fecha_anterior, mat_id_anterior, fec.TipoExamen.Id,
                                                            fec.Materia.Id, fec.Fe_fecha)
                   : false;
            }
            catch (exceptions.daexception ex)
            {
                modificada = false;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                modificada = false;
                throw new exceptions.blexception(ex.Message);
            }

            return modificada;


        }

        public System.Data.DataTable FindAllFechas()
        {
            DataTable tablaFechas = null;

            try
            {
                tablaFechas = createFechaExamen.FindAllFechas();
            }
            catch (exceptions.daexception ex)
            {
                tablaFechas = null;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                tablaFechas = null;
                throw new exceptions.blexception(ex.Message);
            }

            return tablaFechas;
        }

        public List<bo.FechaExamenbo> FindExamenesbyFecha(DateTime fe_fecha)
        {
            List<bo.FechaExamenbo> fechas = null;

            try
            {
                List<Entities.FechaExamen> fecs = (null != fe_fecha)
                    ? createFechaExamen.FindExamenesbyFecha(fe_fecha)
                    : null;

                if (null != fecs)
                {
                    fechas = new List<bo.FechaExamenbo>();

                    foreach (var f in fecs)
                    {
                        bo.TipoExamenbo tipo = createTipoExamen.FindTipoExamenById(f.Tie_id);

                        bo.Materiabo mat = createMateria.FindMateriaByMatId(f.Mat_id);

                        bo.FechaExamenbo fec = new bo.FechaExamenbo();

                        fec.Fe_fecha = f.Fe_fecha;
                        fec.Fe_id = f.Fe_id;
                        fec.Materia = mat;
                        fec.TipoExamen = tipo;

                        fechas.Add(fec);

                        fec = null;

                        tipo = null;

                        mat = null;
                    }
                }
            }
            catch (exceptions.daexception ex)
            {
                fechas = null;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                fechas = null;
                throw new exceptions.blexception(ex.Message);
            }

            return fechas;
        }

        public List<bo.FechaExamenbo> FindExamenesbyMateria(int mat_id)
        {
            List<bo.FechaExamenbo> fechas = null;

            try
            {
                List<Entities.FechaExamen> fecs = (0 != mat_id)
                    ? createFechaExamen.FindExamenesbyMateria(mat_id)
                    : null;

                if (null != fecs)
                {
                    fechas = new List<bo.FechaExamenbo>();

                    foreach (var f in fecs)
                    {
                        bo.TipoExamenbo tipo = createTipoExamen.FindTipoExamenById(f.Tie_id);

                        bo.Materiabo mat = createMateria.FindMateriaByMatId(f.Mat_id);

                        bo.FechaExamenbo fec = new bo.FechaExamenbo();

                        fec.Fe_fecha = f.Fe_fecha;
                        fec.Fe_id = f.Fe_id;
                        fec.Materia = mat;
                        fec.TipoExamen = tipo;

                        fechas.Add(fec);

                        fec = null;

                        tipo = null;

                        mat = null;
                    }
                }
            }
            catch (exceptions.daexception ex)
            {
                fechas = null;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                fechas = null;
                throw new exceptions.blexception(ex.Message);
            }

            return fechas;
        }


        public bo.FechaExamenbo FindExamenbyId(int fe_id)
        {
            bo.FechaExamenbo fecha = null;

            try
            {
                Entities.FechaExamen fec = (0 != fe_id)
                    ? createFechaExamen.FindExamenbyId(fe_id)
                    : null;

                if (null != fec)
                {
                    fecha = new bo.FechaExamenbo();

                    fecha.Fe_fecha = fec.Fe_fecha;
                    fecha.Fe_id = fec.Fe_id;
                    fecha.Materia = createMateria.FindMateriaByMatId(fec.Mat_id);
                    fecha.TipoExamen = createTipoExamen.FindTipoExamenById(fec.Tie_id);

                }
            }
            catch (exceptions.daexception ex)
            {
                fecha = null;
                throw new exceptions.blexception(ex.Message);
            }
            catch (Exception ex)
            {
                fecha = null;
                throw new exceptions.blexception(ex.Message);
            }

            return fecha;
        }
    }
}
